'''
给定一个非空且只包含非负数的整数数组 nums，数组的 度 的定义是指数组里任一元素出现频数的最大值。

你的任务是在 nums 中找到与 nums 拥有相同大小的度的 最短连续子数组，返回其长度。

找到 数组中出现最多元素的次数  然后找到 包含这些元素的最短连续子数组 返回数组的长度
 
1、先统计 每个数字出现的次数,第一次出现的位置、最后一次出现的位置
2、找出 数组 的度
3、找包含 度元素的最短子数组

enumerate(nums) 枚举 一边遍历 一边记录 索引对应的元素
'''
def findShortestSubArray(nums):
    ## 使用字典记录 数组中元素出现的次数、第一次出现的索引位置、最后一次出现的索引位置
    count = {}
    first = {}
    last  = {}
    
    ## 1、记录出现的次数 和 第一次 和最后一次出现的位置索引
    for i ,num in enumerate(nums):
        if num not in count:
            count[num] = 0          #记录数组元素第一次出现的次数
            first[num] = i          #记录数组元素第一次出现的 索引位置
        count[num] += 1             # 更新出现的次数
        last[num] = i               #记录数组元素 最后一次出现的 索引位置
        
    print(count)
    print(first)
    print(last)
    ## 2、找到数组的度
    degree = max(count.values())
    
    ## 3、找出度对应的元素 返回其最小子串
    min_length = len(nums)
    for num in count:
        if count[num] == degree:
            length = last[num] - first[num] + 1
            ## 边界判断
            if length < min_length:
                 min_length = length
    return min_length

if __name__ == "__main__":
    print(findShortestSubArray([1,2,2,3,1]))
    